// +----------------------------------------------------------------------
// | EasyGoAdmin敏捷开发框架 [ 赋能开发者，助力企业发展 ]
// +----------------------------------------------------------------------
// | 版权所有 2019~2022 深圳EasyGoAdmin研发中心
// +----------------------------------------------------------------------
// | Licensed LGPL-3.0 EasyGoAdmin并不是自由软件，未经许可禁止去掉相关版权
// +----------------------------------------------------------------------
// | 官方网站: http://www.easygoadmin.vip
// +----------------------------------------------------------------------
// | Author: @半城风雨 团队荣誉出品
// +----------------------------------------------------------------------
// | 版权和免责声明:
// | 本团队对该软件框架产品拥有知识产权（包括但不限于商标权、专利权、著作权、商业秘密等）
// | 均受到相关法律法规的保护，任何个人、组织和单位不得在未经本团队书面授权的情况下对所授权
// | 软件框架产品本身申请相关的知识产权，禁止用于任何违法、侵害他人合法权益等恶意的行为，禁
// | 止用于任何违反我国法律法规的一切项目研发，任何个人、组织和单位用于项目研发而产生的任何
// | 意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失 (包括但不限于直接、间接、
// | 附带或衍生的损失等)，本团队不承担任何法律责任，本软件框架禁止任何单位和个人、组织用于
// | 任何违法、侵害他人合法利益等恶意的行为，如有发现违规、违法的犯罪行为，本团队将无条件配
// | 合公安机关调查取证同时保留一切以法律手段起诉的权利，本软件框架只能用于公司和个人内部的
// | 法律所允许的合法合规的软件产品研发，详细声明内容请阅读《框架免责声明》附件；
// +----------------------------------------------------------------------

package common
//package base64Captcha
import (

	"easygoadmin/utils"
	"fmt"
	"github.com/kataras/iris/v12"
	"github.com/mojocn/base64Captcha"
	"strings"
	"time"
)
const CAPTCHA = "captcha:"
const EXPIRETIME  = (time.Hour * 24 * 30)

// Captcha captcha basic information.
type RCaptcha struct {
	Ctx iris.Context
	Driver base64Captcha.Driver
}

//NewCaptcha creates a captcha instance from driver and store
func NewCaptcha(ctx iris.Context, driver base64Captcha.Driver) *RCaptcha {
	return &RCaptcha{Ctx:ctx,Driver: driver}
}

//Generate generates a random id, base64 image string or an error if any
func (c *RCaptcha) Generate() (id, b64s string, err error) {
	id, content, answer := c.Driver.GenerateIdQuestionAnswer()
	item, err := c.Driver.DrawCaptcha(content)
	if err != nil {
		return "", "", err
	}
	c.Set(answer) //数据已经存到redis
	fmt.Println("captcha=",answer,"id=",id)
	//c.Ctx.Values().Set(CAPTCHA+"b64s",b64s)
	b64s = item.EncodeB64string()
	fmt.Println("captcha B64s=",b64s)
	return
}

//Verify by a given id key and remove the captcha value in store,
//return boolean value.
//if you has multiple captcha instances which share a same store.
//You may want to call `store.Verify` method instead.
func (c *RCaptcha) Verify(answer string ) (match bool) {

	vv := c.Get()
	//fix issue for some redis key-value string value
	vv = strings.TrimSpace(vv) ///默认字符验证码
	match = vv == strings.TrimSpace(answer)
	return
}

//实现设置captcha的方法
func (c *RCaptcha) Set(value string)    {
	session := utils.Sess.Start(c.Ctx)
	c.Ctx.Values().Set(CAPTCHA,value) //存 ctx 是为了本次处理保存全局变量
	utils.RedisDb.Set( session.ID(),  utils.RedisDb.Acquire(session.ID(),time.Minute*3),CAPTCHA, value,true)//存redis 是为了支持分布式架构
	return
}

//实现获取captcha的方法
func (c *RCaptcha) Get() string {
	session := utils.Sess.Start(c.Ctx)
	val := utils.RedisDb.Get(session.ID(), CAPTCHA).(string)

	return val
}

